package com.tjjingpan.jetpack

import android.content.Context
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.core.content.edit
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.tjjingpan.jetpack.viewmodel.MainViewModel
import com.tjjingpan.jetpack.viewmodel.MainViewModelFactory
import kotlinx.android.synthetic.main.activity_main.*

//git pull origin master --allow-unrelated-histories

/*
* 只要Activity是继承睡自AppCompatActivity的，或者Fragment是继承自androidx.Fragment.app.Fragment的,
* 那么它们本自就是一个LifecycleOwner的实例
* */
class MainActivity : AppCompatActivity() {
    lateinit var viewModel:MainViewModel
    lateinit var sp:SharedPreferences
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        lifecycle.addObserver(MyObserver(lifecycle)) //MyObserver自动感知Activity的生命周期


        sp = getPreferences(Context.MODE_PRIVATE)
        val countReserved = sp.getInt("count_reserved",0)

        /*
        * 在ViewModelProvides的of方法中，额外传入了一人MainViewModelFactory参数，这里将读取到的计数值
        * 传给了MainViewModelFactory的构造函数。注意，这一步是非常重要的，只有用这种写法才能将计算值最终
        * 传递给MainViewModel的构造函数
        * */
        viewModel = ViewModelProviders.of(this,MainViewModelFactory(countReserved))
            .get(MainViewModel::class.java)

        plusOnBtn.setOnClickListener{
//            viewModel.counter++
//            refreshCounter()
            viewModel.plusOne()
        }

        clearBtn.setOnClickListener{
//            viewModel.counter = 0
//            refreshCounter()
            viewModel.clear()
        }
//        refreshCounter()

        /*
        * 调用viewModel.counter的observer()方法来观察数据的变化。经过对MainViewModel的改造，现在counter变量
        * 已经变成了一个LiveData对象，任何LiveData对象都可以调用它的observer()方法来观察数据的变化。observer()方法
        * 接收两个参数：第一个参数是一个LifecycleOwner对象，有没有觉得很熟悉？没错，Activity本身就是一个LifecycleOwner对象
        * ，因此直接传this就好；第二个参数是一个Observer接口，当counter中包含的数据发生变化时，就会回调到这里，
        * 因此我们在这里将最新的计数更新到界面上即可。
        * */
        viewModel.counter.observe(this, Observer { count ->
            infoText.text = count.toString()
        })



        getUserBtn.setOnClickListener{
            val userId = (0..10000).random().toString()
            viewModel.getUser(userId)
        }
        viewModel.user.observe(this,{user ->
            infoText.text = user.firstName
        })
    }
    override fun onPause() {
        super.onPause()
//        sp.edit {
//            putInt("count_reserved",viewModel.counter)
//        }
        sp.edit{
            putInt("count_reserved",viewModel.counter.value?:0)
        }
    }

    //显示当前计数
    private fun refreshCounter(){
        infoText.text = viewModel.counter.toString()
    }
}